package cn.xuguowen.bean;

import lombok.Data;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

/**
 * ClassName: PageResponse
 * Package: cn.xuguowen.bean
 * Description:
 *          通用的分页返回对象。之前封装的哪个仅仅是MyBatis下的分页响应对象
 * @Author 徐国文
 * @Create 2023/3/5 11:31
 * @Version 1.0
 */
@Data
public class PageResponse<T> implements Serializable {
    /**
     * 当前页码
     */
    private Long pageNo = 1L;
    /**
     * 每页显示的条数
     */
    private Long pageSize = 10L;
    /**
     * 总记录数
     */
    private Long total = 0L;
    /**
     * 总页数
     */
    private Long totalPage = 0L;
    /**
     * 当前页的记录。
     * 泛型是参数多态（这几天正好在看Java成神之路的书籍，里面有这样说到）。
     * 声明与定义函数、复合类型、变量时不指定其具体的类型，而是把这部分类型作为参数使用，使得该定义对各种具体类型都适用。
     * 例如Java中的泛型就是参数多态的一种。另一个应用比较广泛的地方就是函数式编程。
     */
    private List<T> result = Collections.emptyList();

    private Long start = 1L;

    private Long end = 0L;

    public PageResponse() {}

    // 设置每页显示的条数
    public void setPageSize(Long pageSize) {
        if (pageSize != null || pageSize > 0) {
            this.pageSize = pageSize;
        }
    }

    // 设置当前页码
    public void setCurrent(Long pageNo) {
        if (pageNo != null || pageNo > 0) {
            this.pageNo = pageNo;
        }
    }

    // 设置分页记录
    public void setRecords(List<T> result) {
        this.result = result;
        if (result != null && result.size() > 0 && this.total == 0) {
            this.setTotal(Long.valueOf(result.size()));
        }

    }

    /**
     * 设置总记录数
     * @param total
     */
    public void setTotal(Long total) {
        this.total = total;

        if (total == -1) {
            this.pageNo = 1L;
            return;
        }

        // 计算总页数
        if (this.pageSize > 0) {
            this.totalPage = (total / this.pageSize) + (total % this.pageSize == 0 ? 0 : 1);
        } else {
            this.totalPage = 0L;
        }

        // 计算start(offset)和end.这是给前端看的。其实后端返回0的化，是下表的概念，没必要给前端看
        this.start = (this.pageNo > 0 ? (this.pageNo - 1) * this.pageSize : 0) + 1;
        this.end = (this.start - 1 + this.pageSize * (this.pageNo > 0 ? 1 : 0));

    }
}
